[26.04_linux-nvidia] NVIDIA: SAUCE: watchdog: sbsa_gwdt: stop the watchdog across the whole system-sleep transition - #568
Conversation
BaseOS Kernel ReviewWarning
|
PR Validation ReportPatchscan ✅ No Missing FixesAll cherry-picked commits checked — no missing upstream fixes found. PR Lint ✅ All checks passedDetailsChecking 1 commits... Cherry-pick digest: ┌──────────────┬──────────────────────────────────────────────────────────────────┬────────────┬─────────┬───────────────────────────┐ │ Local │ Referenced upstream / Patch subject │ Patch-ID │ Subject │ SoB chain │ ├──────────────┼──────────────────────────────────────────────────────────────────┼────────────┼─────────┼───────────────────────────┤ │ 40aebd1a8a1f │ [SAUCE] watchdog: sbsa_gwdt: stop the watchdog across the whole │ N/A │ N/A │ dcemin │ └──────────────┴──────────────────────────────────────────────────────────────────┴────────────┴─────────┴───────────────────────────┘ Lint: all checks passed. |
|
@dcemin-nv I created the Launchpad bug for this change: Could you please add this link to the PR description? Also we need below information to track these patches: |
|
|
Tracking info: internal NVbug 6611666 (watchdog initiated reset during suspend entry on the N1x stress runs). Upstream plan: the patch is prepared against current mainline and is being posted to linux-watchdog (Wim Van Sebroeck, Guenter Roeck cc linux-watchdog@vger.kernel.org); I will add the lore link here once it is archived. |
|
This is what I found with Codex: |
b5ac609 to
f8c1047
Compare
|
@clsotog the finding is correct. The PM notifier stops the hardware by calling the driver's stop op directly, so WDOG_HW_RUNNING stays set, and the existing dev_pm_ops resume callback then restarts the watchdog during dpm_resume, before PM_POST_SUSPEND. That leaves the watchdog armed with nobody refreshing it through thaw, a shorter window than the entry side this patch fixes, but the same class of problem. Fix for v2: with the notifier owning the whole sleep transition, the per device suspend and resume callbacks are redundant, so I will drop SET_SYSTEM_SLEEP_PM_OPS from the driver and let PM_PREPARE and PM_POST be the only stop and start points. I will also rebase the branch onto current 26.04_linux-nvidia, since it currently duplicates three commits that have since landed in the base. The same v2 goes to the linux-watchdog list. |
4c4bd0c to
114f33b
Compare
|
Thanks one more little thing at the commit I see this line: |
114f33b to
e28c4a4
Compare
|
v2 pushed: e28c4a4 (569: 1f857bc). Fixes: 57d2caa trailer added, Change-Id line removed, description updated to the v2 behaviour (no dev_pm_ops, the notifier is the sole stop and start point). On the retest question: the change relative to v1 only removes the redundant device callbacks, so the v1 soak result is claimed for v2. |
|
Thanks for the changes. There are comments in PR 569. This is what codex found in my part:
|
|
Thanks, the
|
…e system-sleep transition The driver stops a running watchdog in its own device suspend callback and restarts it in its resume callback. That leaves the watchdog armed, with nobody refreshing it, for the entire early part of suspend entry: userspace freeze, kernel thread freeze, and every device suspend callback that runs before this device's own. The same window exists at the tail end of resume. When the watchdog is running from boot (early_enable=1, previously force_enable=1 downstream; 10 s default timeout) and any device stalls its suspend callback past the timeout, the watchdog resets the system in the middle of suspend entry. On N1x (Yukon) this fired on about 7% of suspend attempts in a randomized stress run (9 resets in 124 suspends; the serial console shows the board dropping into the boot ROM mid-entry with the watchdog reset status set in NONRST_REG2). Two elimination runs confirm the mechanism: the identical stress matrix with the parameter off produced zero resets in 118 suspends, and with the first version of this change (notifier plus the original device callbacks) applied and the watchdog force-enabled, zero resets in 198 suspends across four runs (the baseline rate predicts about 14). The version here keeps that mechanism, removes the device resume callback and adds the locking described below; it is compile tested. Stop the watchdog from a PM notifier at the *_PREPARE events, before tasks are frozen and device callbacks run, and restart it at the PM_POST_* events, after everything has resumed. The driver state (armed, stopped for sleep) lives under a lock shared with the watchdog ops, so a userspace stop or magic close after thaw cannot race the restart, and a start requested while the transition is in progress is deferred until PM_POST_* instead of arming hardware nobody can refresh. The notifier is registered before anything can arm the watchdog and its failure fails the probe. A suspend-only device callback remains as the final guard for a device whose probe overlapped the *_PREPARE event; it has no resume counterpart, so nothing re-arms the watchdog during device resume, before PM_POST_SUSPEND. This is also upstream-relevant as a companion to the early_enable parameter: the armed-during-entry window exists for any system running the SBSA watchdog from boot. Fixes: 57d2caa ("Watchdog: introduce ARM SBSA watchdog driver") Signed-off-by: David Cemin <dcemin@nvidia.com>
e28c4a4 to
40aebd1
Compare
|
v3 pushed: 568 = 40aebd1, 569 = 3f6de47, same driver file on both. It addresses the four points raised by Nirmoy (Codex P1/P2), Cristian and Jamie:
Commit message: the validation sentence is scoped to the first revision (notifier plus the original device callbacks, 198 suspends, zero resets) and states that this revision is compile tested; the Fixes: trailer is unchanged. Both flavours built with W=1 with no warnings, checkpatch strict is clean. |
|
I agree with the current Boro finding about the remaining Nit: Both PR descriptions still say “v2 is compile verified” and claim the v1 soak result for v2. These are now substantive v3 heads with new locking and a suspend fallback. Please update the validation paragraph to identify the exact v3 build validation and keep it distinct from the v1 runtime soak. |
BugLink: https://bugs.launchpad.net/ubuntu/+source/linux-nvidia/+bug/2166302
Fix for a watchdog initiated system reset during suspend entry, found and root caused on the N1x laptop program.
The driver stops a running watchdog only in its device suspend callback, which leaves it armed with nobody refreshing it through userspace freeze, kernel thread freeze, and every device suspend callback that runs earlier (same window at the tail of resume). With the watchdog running from boot and a 10 second timeout, any slow device suspend resets the system mid entry. On N1x this fired on about 7 percent of suspend attempts in randomized stress runs (9 resets in 124 suspends); two elimination runs confirm the mechanism (0 resets in 118 with the watchdog off, 0 in 198 with this fix and the watchdog force enabled, where the baseline rate predicts about 14).
v3: the notifier owns the transition, stopping at PREPARE and restarting at PM_POST, with the driver state kept under a lock shared with the watchdog ops so a userspace stop or magic close after thaw cannot race the restart, and a start requested during the transition is deferred to PM_POST_*. The notifier is registered before anything can arm the watchdog and its failure fails the probe. A suspend-only device callback remains as the final guard for a probe that overlapped the PREPARE event; it has no resume counterpart. The commit carries Fixes: 57d2caa ("Watchdog: introduce ARM SBSA watchdog driver").
Validation: the 198 suspend elimination matrix and the 200 cycle confirmation run were performed on v1 (notifier plus dev_pm_ops). v2 is compile verified on both branches; the change relative to v1 only removes the redundant device callbacks, so the v1 soak result is claimed for v2. Shipping in the N1x FastOS kernel.
Notes for review: